/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.evangelion.core.controller;

import com.evangelion.core.bean.Alumno;
import com.evangelion.core.bean.Datossolicitud;
import com.evangelion.core.bean.Permisomatriculado;
import com.evangelion.core.bean.Permisoposee;
import com.evangelion.core.bean.Seccione;
import com.evangelion.core.bean.Usuario;
import com.evangelion.core.service.AlumnoService;
import com.evangelion.core.serviceImpl.AlumnoServiceImpl;
import com.evangelion.core.daoImpl.ConnectionUtil;
import com.evangelion.core.utils.MensajesFace;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.Serializable;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.util.*;
import org.primefaces.context.RequestContext;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

/**
 *
 * @author Kellycasma
 */
@ManagedBean
@ViewScoped
public class AlumnoController extends MensajesFace implements Serializable {

    private Alumno alumno;
    AlumnoService serviceAlunmo = new AlumnoServiceImpl();
    String valorBusqueda;
    Date diffFecha;
    private LazyDataModel<Alumno> listaAlumno;
    Permisomatriculado permisomatriculado;
    Permisoposee permisoposee;
    Seccione seccio;
    Usuario usu;
    DefaultStreamedContent dc;
    boolean todo;

    @PostConstruct
    public void init() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
        HttpSession httpSession = request.getSession(false);
        if (httpSession != null) {
            usu = (Usuario) httpSession.getAttribute("UserSession");
            seccio = (Seccione) httpSession.getAttribute("seccion");
        }
        alumno = new Alumno();
        alumno.setDatossolicitud(new Datossolicitud());
        alumno.setPermisomatriculadoList(new ArrayList<Permisomatriculado>());
        alumno.setPermisoposeeList(new ArrayList<Permisoposee>());
//        alumno.setPermisomatriculadoList(null);
        permisomatriculado = new Permisomatriculado();
        permisoposee = new Permisoposee();
//        listaAlumno = new ArrayList<Alumno>();
//        listaAlumno = (List) serviceAlunmo.searchByNifNombre(seccio, "");
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.YEAR, -10);
        diffFecha = calendar.getTime();
        todo = false;
    }

    @SuppressWarnings("serial")
    public void configDataModel() {
            listaAlumno = new LazyDataModel<Alumno>() {
                @Override
                public List<Alumno> load(int start, int max, String arg2,
                        SortOrder arg3, Map<String, String> arg4) {
                    if (valorBusqueda == null) {
                        valorBusqueda = "";
                    }
                    List<Alumno> listaAlu = (List) serviceAlunmo.searchByNifNombre(seccio, valorBusqueda, start, max);
                    return listaAlu;
                }
            };
            listaAlumno.setRowCount(serviceAlunmo.countPage(seccio, valorBusqueda));
    }

    public void printpdf(Map parameters, String archivo, int id) {
        try {
            todo = false;
            Connection conexion = ConnectionUtil.getConnection();
            String urlMaster = ConnectionUtil.getServletContext().getRealPath(File.separator + "general" + File.separator + "reportes" + File.separator + archivo);
            JasperReport reporteMaster = null;
            try {
                reporteMaster = (JasperReport) JRLoader.loadObject(urlMaster);
            } catch (Exception e) {
                e.printStackTrace();
            }
            JasperPrint print = null;
            print = JasperFillManager.fillReport(reporteMaster, parameters, conexion);
            byte[] bytes = JasperExportManager.exportReportToPdf(print);
            System.out.println("byte: " + bytes.length);
            if (bytes.length >= 1211 && bytes.length <= 1400) {
                System.out.println("tamano menor");
                dc = null;
                System.out.println("El reporte no genero ningun resultado");
            } else {
                todo = true;
                InputStream stream = new ByteArrayInputStream(bytes);
                dc = new DefaultStreamedContent(stream, "application/pdf", "factura_" + id + ".pdf");
                System.out.println("Reporte generado exitosamente.");

                FacesContext context = FacesContext.getCurrentInstance();
                HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
                HttpSession httpSession = request.getSession(false);
                httpSession.setAttribute("reportBytes", bytes);
                ConnectionUtil.closeConect();
            }
            ConnectionUtil.closeConect();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void prueba(int id) {
        String archivo = "resporteFacturaArenal.jasper";
        Map parameters = new HashMap();
        parameters.put("id", id);
        printpdf(parameters, archivo, id);
    }

//    public void runReporte() {
//        try {
//
//            //String urlMaster = ConnectionUtil.getServletContext().getRealPath(File.separator + "general" + File.separator + "reportes" + File.separator + "reporteFacturaAlumno.jasper");
//            //String urlMaster = "C:/Users/Kellycasma/Desktop/Copia Seguridad/nueva carpeta/Evangelion/web/general/reportes/reporteFacturaAlumno.jasper";
//            File urlMaster = null;
//            urlMaster = new File(File.separator + "general" + File.separator + "reportes" + File.separator + "reporteFacturaAlumno.jasper");
//
//            System.out.println("Master " + urlMaster);
//            if (urlMaster == null) {
//                System.out.println("No se encuentra el archivo del reporte");
//            }
//            System.out.println("1");
//            JasperReport masterReport = null;
//            System.out.println("2");
//            try {
//                System.out.println("3");
//                masterReport = (JasperReport) JRLoader.loadObject(urlMaster);
//                System.out.println("4");
//            } catch (JRException e) {
//                System.out.println("Error al cargar el reporte " + e.getMessage());
//            }
//            System.out.println("5");
//            Map parametro = new HashMap();
//            System.out.println("6");
//            JasperPrint jp = JasperFillManager.fillReport(masterReport, parametro);
//            System.out.println("7");
//            JasperViewer jv = new JasperViewer(jp, false);
//            System.out.println("8");
//            jv.setTitle("Factura Reporte");
//            System.out.println("9");
//            jv.setVisible(true);
//            System.out.println("10");
//        } catch (Exception e) {
//            System.out.println("Error al generar Reporte " + e.getMessage());
//        }
//    }
    public void addPermisoMatriculado() {
        permisomatriculado.setAlumno(alumno);
        permisomatriculado.setFechaingreso(new Date());
        alumno.getPermisomatriculadoList().add(permisomatriculado);
        permisomatriculado = new Permisomatriculado();
    }

    public void addPermisoPosee() {
        permisoposee.setAlumno(alumno);
        permisoposee.setFechaingreso(new Date());
        alumno.getPermisoposeeList().add(permisoposee);
        permisoposee = new Permisoposee();
    }

    public void deletePermisoPosee(Permisoposee perpos) {
        int remover = 0;
        for (int i = 0; i < alumno.getPermisoposeeList().size(); i++) {
            if (alumno.getPermisoposeeList().get(i).getPermiso().equals(perpos.getPermiso())) {
                remover = i;
            }
        }
        alumno.getPermisoposeeList().remove(remover);
        RequestContext.getCurrentInstance().execute("loadtablapermisoposee()");

    }

    public void deletePermisoMatriculado(Permisomatriculado permatr) {
        int remover = 0;
        for (int i = 0; i < alumno.getPermisomatriculadoList().size(); i++) {
            if (alumno.getPermisomatriculadoList().get(i).getPermiso().equals(permatr.getPermiso())) {
                remover = i;
            }
        }
        alumno.getPermisomatriculadoList().remove(remover);
        RequestContext.getCurrentInstance().execute("loadtablapermisomatriculado()");

    }

    public void save() {
        if (validarForm()) {


            alumno.setCliente(usu.getCliente());
            alumno.setSeccion(seccio);

            if (alumno.getId() == null) {
                alumno.setFechaCreacion(new Date());
            }
            alumno.setFechaActualizacion(new Date());
            serviceAlunmo.save(alumno);
            limpiarForm();
            msgCambiosGuardados();
            init();
        }
    }

    public void limpiarForm() {
        alumno = new Alumno();
    }

    public Alumno getAlumno() {
        return alumno;
    }

    public boolean validarForm() {
        boolean requerido = true;

        if (!validarNIF(alumno.getNif())) {
            msgValidacion("EL NIF");
            requerido = false;
        }
        try {
            Alumno alumnoTemporal = (Alumno) serviceAlunmo.findObjByParam("nif", alumno.getNif());
            System.out.println("alumnoTemporal:" + alumnoTemporal);
            if (alumnoTemporal != null) {
                System.out.println("alumnoTemporal:-----------" + alumnoTemporal.getId());
                if ((alumno.getId() == null || (!alumno.getId().equals(alumnoTemporal.getId()) && alumno.getId() != null))) {
                    msgValidacion("Ya existe pertenece a " + alumnoTemporal.getNombres());
                    requerido = false;
                } else {
                    if (alumno.getId() != null) {
                        alumno.setNif(alumnoTemporal.getNif());
                    }
                }
            }
            return requerido;
        } catch (Exception ex) {
            msgValidacion("Ha ocurrido un error");
            return false;
        }
    }

    public void search() {
        System.out.println("...valorBusqueda" + valorBusqueda);
        configDataModel();
    }

    public static boolean validarNIF(String nif) {
        boolean correcto = false;
        Pattern pattern = Pattern.compile("(\\d{1,8})([TRWAGMYFPDXBNJZSQVHLCKEtrwagmyfpdxbnjzsqvhlcke])");
        Matcher matcher = pattern.matcher(nif);
        if (matcher.matches()) {
            String letra = matcher.group(2);
            String letras = "TRWAGMYFPDXBNJZSQVHLCKE";
            int index = Integer.parseInt(matcher.group(1));
            index = index % 23;
            String reference = letras.substring(index, index + 1);

            if (reference.equalsIgnoreCase(letra)) {
                correcto = true;
            }
        }
        return correcto;
    }

    public String getValorBusqueda() {
        return valorBusqueda;
    }

    public LazyDataModel<Alumno> getListaAlumno() {
        return listaAlumno;
    }

    public void setListaAlumno(LazyDataModel<Alumno> listaAlumno) {
        this.listaAlumno = listaAlumno;
    }

    public void setValorBusqueda(String valorBusqueda) {
        this.valorBusqueda = valorBusqueda;
    }

    public void setAlumno(Alumno alumno) {
        this.alumno = alumno;
    }

    public Permisomatriculado getPermisomatriculado() {
        return permisomatriculado;
    }

    public void setPermisomatriculado(Permisomatriculado permisomatriculado) {
        this.permisomatriculado = permisomatriculado;
    }

    public Permisoposee getPermisoposee() {
        return permisoposee;
    }

    public void setPermisoposee(Permisoposee permisoposee) {
        this.permisoposee = permisoposee;
    }

    public DefaultStreamedContent getDc() {
        return dc;
    }

    public void setDc(DefaultStreamedContent dc) {
        this.dc = dc;
    }

    public Date getDiffFecha() {
        return diffFecha;
    }

    public void setDiffFecha(Date diffFecha) {
        this.diffFecha = diffFecha;
    }

    public boolean isTodo() {
        return todo;
    }

    public void setTodo(boolean todo) {
        this.todo = todo;
    }
}
